-- 2022-8-1

--[[函数是第一类值
    -- 例如
    a = {p = print}
    a.p("Hello World")
    print = math.sin
    a.p(print(1))
    math.sin = a.p
    math.sin(10,20)

    -- 如果函数是值的话，那么十分有创建函数的表达式呢？答案是肯定的，事实上，Lua语言中常见的函数定义式如下
    -- function foo (x) return x end
    -- 就是所谓的语法糖的例子，它只是下面这种写法的一种美化形式
    -- foo = function (x) return x end
    -- 赋值语句右边的表达式就是函数构造器，与表构造器相似
    -- 因此，函数定义实际上就是创建类型为"function"的值并把它赋值给一个变量的语句

    -- 在Lua语言中所有的函数都是匿名的。像其他所有的值一样函数并没有名字。
    -- 当讨论函数名时，比如print，实际上指的是保存该函数的变量，虽然我们通常会把函数赋值给全局变量，从而看似给函数起了一个名字
    -- 但在很多场景下仍然会保留函数的匿名性

    -- 匿名函数有很好的便利性
    -- 例如
    network = {
        {name = "gra",IP = "111"},
        {name = "arr",IP = "222"},
        {name = "lua",IP = "333"},
        {name = "der",IP = "444"}
    }
    table.sort(network,function(a,b) return (a.name>b.name) end)
    -- 像sort这样以另一个函数为参数的函数，我们称之为高阶函数
    -- 高阶函数是一种强大的编程机制，而匿名函数作为参数正是其灵活性的主要来源
    -- 高阶函数没有什么特殊的，只是lua语言将函数作为第一类值处理所带来结果的直接体现
--]]